/*
 * Niiuzu
 * Copyright (C) 2011  Thierry Nowak
 * 
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.niiuzu.client.eventbus;

import com.google.gwt.user.client.ui.IsWidget;
import com.mvp4g.client.annotation.Event;
import com.mvp4g.client.annotation.Events;
import com.mvp4g.client.event.EventBus;
import com.niiuzu.client.module.FeedModule;
import com.niiuzu.client.screen.feed.FeedPresenter;
import com.niiuzu.client.screen.feed.channel.factory.ChannelFactoryPresenter;
import com.niiuzu.client.screen.feed.filter.FeedFilterPresenter;
import com.niiuzu.client.screen.feed.group.factory.ChannelGroupFactoryPresenter;
import com.niiuzu.client.screen.feed.remove.channel.RemoveChannelPresenter;
import com.niiuzu.client.screen.feed.viewer.FeedViewerPresenter;
import com.niiuzu.client.screen.feed.viewer.FeedViewerViewImpl;
import com.niiuzu.client.util.LoadingTicket;
import com.niiuzu.shared.model.FeedChannel;
import com.niiuzu.shared.model.FeedEntry;

/**
 * EventBus regroupant tous les événements qui concerne la recherche et
 * l'affichage des entrées des flux RSS.
 */
@Events(startView = FeedViewerViewImpl.class, module = FeedModule.class)
public interface FeedEventBus extends EventBus, CommonEventBus {

	/**
	 * L'application vient de démarrer, l'affichage de la gestion des flux et
	 * des données RSS est demandée.
	 * 
	 * @see FeedPresenter#onApplicationStarted()
	 */
	@Event(handlers = FeedPresenter.class)
	void applicationStarted();

	/**
	 * Le chargement de la vue de la gestion des données et des flux RSS vient
	 * de débuter.
	 * 
	 * @see FeedFilterPresenter#onChannelFilterLoadingStarted()
	 */
	@Event(handlers = FeedFilterPresenter.class)
	void channelFilterLoadingStarted();

	/**
	 * Le chargement de la vue de la gestion des données et des flux RSS est
	 * terminée.
	 * 
	 * @see FeedPresenter#onChannelFilterLoaded(IsWidget)
	 */
	@Event(handlers = FeedPresenter.class)
	void channelFilterLoaded(IsWidget widget);

	/**
	 * Le chargement de la vue dédiée à la consultation des données provenant
	 * des flux RSS vient de débuter.
	 * 
	 * @see FeedViewerPresenter#onFeedViewerLoadingStarted()
	 */
	@Event(handlers = FeedViewerPresenter.class)
	void feedViewerLoadingStarted();

	/**
	 * Le chargement de la vue dédiée à la consultation des données provenant
	 * des flux RSS est terminée.
	 * 
	 * @see FeedPresenter#onFeedViewerLoaded(IsWidget)
	 */
	@Event(handlers = FeedPresenter.class)
	void feedViewerLoaded(IsWidget widget);

	/**
	 * La vue du gestionnaiManagerre des flux RSS est chargée.
	 * 
	 * @see ApplicationEventBus#feedMainViewLoaded(IsWidget)
	 */
	@Event(forwardToParent = true)
	void feedMainViewLoaded(IsWidget widget);

	/**
	 * Une erreur a été déclenchée au sein de l'application.
	 * 
	 * @see ApplicationEventBus#technicalErrorOccurred(Throwable)
	 */
	@Event(forwardToParent = true)
	void technicalErrorOccurred(Throwable caught);

	/**
	 * Un message d'erreur non technique vient d'être envoyé.
	 * 
	 * @see ApplicationEventBus#businessErrorOccurred(String)
	 */
	@Event(forwardToParent = true)
	void businessErrorOccurred(String errorMessage);
	
	/**
	 * @see ApplicationEventBus#loadingStarted(LoadingTicket)
	 */
	@Event(forwardToParent = true)
	void loadingStarted(LoadingTicket ticket);
	
	/**
	 * @see ApplicationEventBus#loadingFinished(LoadingTicket)
	 */
	@Event(forwardToParent = true)
	void loadingFinished(LoadingTicket ticket);

	/**
	 * De nouvelles données provenant d'un flux vient d'être reçues.
	 * 
	 * @see FeedViewerPresenter#onFeedEntriesReceived(FeedEntry[])
	 */
	@Event(handlers = FeedViewerPresenter.class)
	void feedEntriesReceived(FeedEntry[] feedEntries);

	/**
	 * Un nouveau flux ({@link FeedChannel}) a été ajouté pour la session en
	 * cours.
	 * 
	 * @see FeedPresenter#onChannelListUpdated()
	 */
	@Event(handlers = FeedPresenter.class)
	void channelListUpdated();

	/**
	 * La suppression d'un flux ou d'un thème vient d'être demandée, cependant
	 * celle-ci n'a pas encore été validée.
	 * 
	 * @see RemoveChannelPresenter#onChannelOrGroupRemoveAsked(FeedChannel)
	 */
	@Event(handlers = RemoveChannelPresenter.class)
	void channelOrGroupRemoveAsked(FeedChannel channel);

	/**
	 * Des flux ont été supprimés de la sessions.
	 * 
	 * @see FeedFilterPresenter#onChannelsRemoved()
	 */
	@Event(handlers = FeedFilterPresenter.class)
	void channelsRemoved();

	/**
	 * Un nouveau flux a été créé.
	 * 
	 * @see FeedFilterPresenter#onChannelCreated()
	 */
	@Event(handlers = FeedFilterPresenter.class)
	void channelCreated();
	
	/**
	 * Un nouveau thème a été créé.
	 * 
	 * @see FeedFilterPresenter#onChannelGroupCreated()
	 */
	@Event(handlers = FeedFilterPresenter.class)
	void channelGroupCreated();

	/**
	 * Une demande du formulaire d'ajout de flux a été passée.
	 * 
	 * @see ChannelFactoryPresenter#onNewChannelAsked()
	 */
	@Event(handlers = ChannelFactoryPresenter.class)
	void newChannelAsked();

	/**
	 * Une demande du formulaire d'ajout de thèmes a été passée.
	 * 
	 * @see ChannelGroupFactoryPresenter#onNewChannelGroupAsked()
	 */
	@Event(handlers = ChannelGroupFactoryPresenter.class)
	void newChannelGroupAsked();
}
